package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import model.Categoria;
import model.Torneo;
import persistence.connection.PoolConnection;

public class TorneoPersistsAdm {

	private static TorneoPersistsAdm torneoPersistsAdm;
	
	private TorneoPersistsAdm(){}
	
	public static TorneoPersistsAdm getInstance(){
		
		if (torneoPersistsAdm == null)
			torneoPersistsAdm = new TorneoPersistsAdm();
		
		return torneoPersistsAdm;
	}
	
	public ArrayList<Torneo> select(){		
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "select * from dbLiforBasquet.dbo.Torneos";
		ArrayList<Torneo> torneos = new ArrayList<Torneo>();
		
		try {			
			PreparedStatement ps = con.prepareStatement(sentencia);
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()){
				Torneo torneo = new Torneo();
				
				torneo.setId(rs.getInt("id"));
				
				java.sql.Date fechaCreacion = rs.getDate("fechaCreacion");
				torneo.setFechaCreacion( new java.util.Date(fechaCreacion.getTime()));
				
				torneo.setDescripcion(rs.getString("descripcion"));
				torneo.setEstado(rs.getString("estado"));
				
				torneo.addCategorias(CategoriaPersistsAdm.getInstance().getCategoriasByTorneo(torneo.getId()));
				
				torneos.add(torneo);
			}		
		} catch (Exception e) {		
			System.out.println("Error al obtener Torneos: " + e.getMessage());
		}	
		
		PoolConnection.getPoolConnection().realeaseConnection(con);
		
		return torneos;
	}
	
	public void insert(Torneo torneo){		
		Connection con = PoolConnection.getPoolConnection().getConnection();

		String sentencia = "insert into dbLiforBasquet.dbo.Torneos " +
						   " (fechaCreacion, descripcion, estado)" +
						   "  values (?,?,?)";
		
		try {			
			PreparedStatement ps = con.prepareStatement(sentencia,PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setDate(1, new java.sql.Date(torneo.getFechaCreacion().getTime()));
			ps.setString(2, torneo.getDescripcion());
			ps.setString(3, torneo.getEstado());
			ps.execute();	
			
			ResultSet generatedKeys = ps.getGeneratedKeys();
			if (generatedKeys.next())
				torneo.setId(generatedKeys.getInt(1));
		} catch (Exception e) {		
			System.out.println("Error al insertar Torneo " + e.getMessage());
		}	
		
		PoolConnection.getPoolConnection().realeaseConnection(con);
		
		//inserto categorias		
		for (Categoria categoria : torneo.getCategorias()){
			CategoriaPersistsAdm.getInstance().insert(categoria, torneo.getId());
		}
	}
}
